FeasyMesh SDK Android 接入文档
1. 摘要
App Project Name : FeasyMeshApp
App Package Name/Bundle Id : com.feasycom.feasymesh
Sdk Project Name : FeasyMeshSdk
Sdk Package Name/Bundle id : com.feasycom.meshsdk
2. 集成
Android集成
添加必须权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
App build.gradle
dependencies{
def room_version = "2.2.0-alpha01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
}
在 app 的 libs 库中添加
implementation files('libs/FeasyMeshSdk.aar')
3. 数据结构
NetWorkBean(网络对象)
public class NetWorkBean implements Serializable {
private long id;
private String netWorkName; //网络Name
private byte[] netWorkId; //网络ID,小端序 2 位字节数组 ,取值范围(1 - 65534)
private byte[] netWorkKey; //网络KEY,取值范围,任意 16 位字节数组
private String netCreator; //创建者,只有创建者才可以对设备入网退网改名等操作,避免数据共享给其他手机被修改
private boolean isSelect = false;//是否选中
}
DiscoveredDevice(扫描到的设备对象)
//Android和ios扫出的设备信息详情有差异,这个对象不会做保存,可以不一样。
public class DiscoveredDevice implements Serializable {
private int customType; //自定义设备类型
private String name;//设备名称
private String mac;//设备MAC地址
private int rssi;//设备信号值
private byte[] networkId;//设备网络ID
private byte[] serialNumberIndex; //设备序列号
private int isEnrolled;// 是否已入网 ==9是已入网
private boolean isSelect = false;//是否选中
private BluetoothDevice bluetoothDevice;
}
NodeBean(设备入网后的节点对象)
// 必须统一
public class NodeBean implements Serializable {
private long id; //数据库自增长键
private String mac;//设备MAC地址
private int customType; //自定义设备类型
private int ver;//设备固件版本
private String name;//设备名称
private byte[] nodeId;//设备节点id
private boolean isSelect = false;
private boolean isOnline = false;//设备是否在线
private byte[] netWorkId;//设备所在网络的网络id
private byte[] serialNumberIndex;//设备序列号
private byte[] controlCmd;//控制命令(状态信息)暂未启用
}
GroupBean(群组对象)
//必须统一
public class GroupBean implements Serializable {
private long id;
private String name;//群组name
private byte[] groupid;//群组id
private byte[] netWorkId;//群组所在网络id
private String netCreator; //创建者
private boolean isSelect = false;//是否选中
}
4. 使用
初始化SDK
MeshSdk.getInstance().Init(Context context);
注册网络监听
void RegisterNetworkListening(MeshNetworkListening meshnetworklistening);
public interface MeshNetworkListening {
//网络连接状态
void onConnectionStateChange(int newState);
//握手完成,只有握手完成后才能获取设备信息和控制设备
void onHandShakeDone();
//网络发生编辑修改
void onNetworkEdit(NetWorkBean netWorkBean);
//有网络添加
void onNetworkAdd(NetWorkBean netWorkBean);
//有网络删除
void onNetworkDel(byte[] netWorkId);
//有节点被删除
void onNodeDel(NodeBean nodeBean);
//连接网络切换改变
void ConnectNetworkChange(NetWorkBean netWorkBean);
//网络内设备上线下线变化
void onNodeOnlineStatechange(int nodeid, boolean isOnline);
}
Mesh群组监听
public interface MeshGroupListening {
//有群组添加
void onGroupAdd(GroupBean groupBean);
//有群组被删除
void onGroupDel(byte[] groupid);
}
创建Mesh网络
/**
*
* @param netWorkName 网络名称
* @param netWorkId 网络ID 范围 1 到65534 ,两字节小端序
* @param netWorkKey 网络KEY 任意 16 字节
* @param netCreator 创建者 要有唯一性后续作为网络数据分享,只有创建者才有权限操作
Mesh网络配置,比如修改网络节点名称,退网等操作
* @param resultcallback
*/
void CreateMeshNetwork(String netWorkName,byte[] netWorkId,byte[] netWorkKey,String
netCreator,ResultCallBack resultcallback);
修改Mesh网络名称
boolean EditMeshNetworkName(byte[] netWorkId,String newName,ResultCallBack resultcallback);
获取Mesh网络列表
void QueryNetworkBeans(DatasCallback datasCallback);
设置当前使用的Mesh网络
/**
*当我们要使用哪个网络时,要先调用这个设置当前网络,当所有网络被删掉,要设置null
*/
void setConnectNetworkBean(NetWorkBean connectNetworkBean)
获取当前使用的Mesh网络
NetWorkBean getConnectNetworkBean()
删除Mesh网络(建议先把网络内所有设备退网,在调用这个删除)
void deleteNetworkBeanByNetworkId(byte[] netWorkId);
扫描附近设备
/**
#### *扫未入网设备和已入网设备都是用这个扫
* @param scanTime 扫描时长
* @param mmeshscancallback
*/
void StartScan(long scanTime,MeshScanCallback,meshscancallback);
停止扫描
void StopScan();
是否正在扫描
/**
*当我们需要做连接或者配网操作时,先要停掉扫描,然后延迟个 500 毫秒在去连接
*/
boolean isScaning();
连接扫描到的设备
void ConnectDiscoveredDevice(Context context,DiscoveredDevice discovereddevice,byte[]
netWorkKey,ResultCallBack resultcallback);
获取当前连接的设备
void getConnectDiscoveredDevice();
断开连接
/**
*str 随便传
*/
void Disconnect(String str);
连接网络
void ConnectMeshNetwork(Context context,NetWorkBean networkbean,ResultCallBack
resultcallback);
网络是否已连接
boolean isHandShakeDone();
单个设备退网
void ExitDevFromNetWork(NodeBean nodeBean, ExitCallBack mexitCallBack);
删除单个设备本地数据
/**
*设备退网本地数据会自动删本地数据,一般情况不需要调用这个接口
*/
boolean DelNodeDatabase(NodeBean nodeBean)
查询本地网络中所有设备
void QueryNodebeans(byte[] networkId, DatasCallback datasCallback);
查询本地设备详情
void QueryNodebean(byte[] nodeid, DataCallback dataCallback);
更新设备节点信息
void UpdataNodebean(NodeBean nodeBean);
发送命令到指定节点
/**
*给群组发消息 nodeid传群地址就行了 传0x00,0x00就是给网络内所有设备发消息
*/
void SendDataToNodeId(byte[] nodeid, byte[] mdata, ResultCallBack resultCallBack);
上行数据监听
void UplinkDataListen(UplinkDataCallBack muplinkDataCallBack);
批量设备入网(最多十个设备同时入网)
void InviteDevsToNetWork(ArrayList<DiscoveredDevice> discoveredDevices, byte[][] newNodeIds,
byte[] newNetworkId, byte[] newNetworkKey, InviteCallBack inviteCallBack);
一键退网(网络内所有设备退网)
void ExitAllDevFromNetWork(ExitCallBack exitCallBackall)
获取设备信息(包含控制命令状态)
void GetNodeInfo(byte[] nodeid, NodeInfoCallBack mnodeInfoCallBack);
使节点进入升级模式
boolean IntoDfu(NodeBean nodeBean);
设备控制
void ControlDev(byte[] nodeid,byte[] cmd,ResultCallBack resultcallback);
创建群组
Random rand = new Random();
final int[] randomNum = {rand.nextInt((30000 - 21000) + 1) + 21000};
GroupBean groupBean = new GroupBean();
groupBean.setId(randomNum[0]);
groupBean.setName(edit_name.getText().toString());
groupBean.setNetCreator(DeviceUtils.getAndroidID());
groupBean.setNetWorkId(MeshSdk.getInstance().getConnectNetworkBean().getNetWorkId());
groupBean.setGroupid(intToLittleEndianHexArray(randomNum[0]));
void CreateGroup(GroupBean groupBean, ResultCallBack resultCallBack);
根据networkId查询Groups
void QueryGroupsBynetworkId(byte[] networkId, DatasCallback datasCallback);
根据groupId查询Group
void QueryGroupBygroupId(byte[] groupId, DataCallback dataCallback);
更新GroupBean
void UpdataGroupBean(GroupBean groupBean,ResultCallBack resultCallBack);
根据groupid删除group
/**
*该方法只会删除群组本地数据,不会移除群组内的设备,建议先移除群组中的节点,在调用该方法
*/
void deleteGroupBygroupId(byte[] groupid,ResultCallBack resultCallBack);
添加设备进入群组
void AddDevicesJoinGroup(List<NodeBean> nodeBeans, byte[] groupid, ResultCallBack resultCallBack);
void AddDeviceJoinGroup(NodeBean nodeBean, byte[] groupid, ResultCallBack resultCallBack);
把设备从群组移除
void RemoveDevFromGroup(NodeBean nodeBean, byte[] groupid, ResultCallBack resultCallBack);
移除群组内所有设备
void RemoveAllDevFromGroup(byte[] groupid, ResultCallBack resultCallBack);
移除网络内所有群组
void RemoveAllGroup(byte[] networkId, ResultCallBack resultCallBack)
查询群组中的设备
void QueryAllDevFromGroup(GroupBean groupBean, DatasCallback datasCallback)
数据导出
void ExportNetData(ExportdataCallback exportdatacallback);
数据导入
void ImportNetData(String jsondata,ResultCallBack resultcallback);
强制清空网络本地数据(该网络相关的所有数据)
void ClearMeshNetworkLocalData(byte[] networkId,ResultCallBack resultcallback);
5. 错误代码
1001 :对象已存在
1002 :参数不存在
1003 :抛异常,待查
1004 :未初始化SDK
1005 :正在搜索中
1006 :最多同时邀请十个设备
1007 : 未连接设备
1008 : 批量入网失败
1009 :消息发送失败
1010 :未找到设备
1011 :groupid取值应该为 21000 到 30000 的整数转小端序的两位字节数组
1012 :握手失败