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 :握手失败

6. 附录

FeasyMesh SDK Android 接入文档 (PDF)