void mqtt_message_arrived(void *client , MessageData* data)
{
mqttRecvMsgType p;
memset(p.payload , 0x00 , sizeof(uint8_t)*data->message->payloadlen);
memcpy(p.payload , data->message->payload , data->message->payloadlen);
msgType = p.payload[0];
sqeId = p.payload[1]|(p.payload[2]<<8);
serType = p.payload[3]|(p.payload[4]<<8);
cmd = p.payload[5]|(p.payload[6]<<8);
if(( serType != 0 ) && ( cmd != 0x8004))
{
log(INFO,"msg type = %d , seq id = %d , server type = %d , cmd = %x \n" , msgType , sqeId , serType , cmd);
}
xQueueSend( xMqttRecvQueue, ( void* )&p, NULL );
//极端优秀!拿到数据以后丢到消息队列
}
static void mqtt_recv_task( void const *pvParameters)
{
mqttRecvMsgType msg;
memset(&msg , 0x00 , sizeof(mqttRecvMsgType));
while( 1 )
{
if(xQueueReceive( xMqttRecvQueue, &msg, 1000 ) == pdTRUE)
{
}
}
}
这就是拿到了playload 有的是JSON 有的是PB!
其实数据很小!
typedef struct
{
uint8_t msgType;
uint16_t sqeId;
uint16_t serType;
uint16_t cmd;
uint8_t data[1500];
uint16_t len;
}mqttDataStrType;
协议命令定义:
// Message Type
public static final int MSG_TYPE_SYSTEM = 0; // 系统消息
public static final int MSG_TYPE_USER = 1; // 自定义消息
// Service Type
public static final int SERVICE_TYPE_COMMON = 0; // 通用业务
public static final int SERVICE_TYPE_ACCESS = 1; // 设备接入业务
public static final int SERVICE_TYPE_PASS = 2; // 智慧通行业务
public static final int SERVICE_TYPE_LOG = 3; // 日志服务
/***
* 设备接入业务:
*/
// 端到云的请求命令
public static final int CMD_TYPE_UPDATE_AESKEY = 1; // 更新AES Key。Body的PB模型为TSLIOTUpdateAESKeyRequest
public static final int CMD_TYPE_WILL = 2; // 遗愿消息命令。Body为hamcsha1(mac, RSA公钥)。
// 云到端的请求命令
public static final int CMD_TYPE_UPDATE_AESKEY_ACK = 0x8000; // 更新AES Key结果。端收到此命令后才能进行后续请求。Body的PB模型为TSLIOTCommonResult
public static final int CMD_TYPE_UPDATE_SUBSCRIPTION = 0x8001; // 更新端订阅话题列表。Body的PB模型为TSLIOTChangeSubscriptionRequest
public static final int CMD_TYPE_REFRESH_AESKEY = 0x8002; // 请求设备端重新刷新一次AES KEY,Body为hamcsha1(mac, RSA公钥)。设备端需要重新更新AES Key流程
/***
* 通用业务:
*/
// 端到云的请求命令
public static final int CMD_TYPE_DEVICE_CONTROL_ACK = 1; // 设备控制结果。Body的PB模型为TSLIOTDeviceControlResult
public static final int CMD_TYPE_DATA_PASS_THROUGH_ACK = 2; // 数据透传通道响应
public static final int CMD_TYPE_MODIFY_PWD_ACK = 3; // 修改设备密码结果。Body的PB模型为TSLIOTCommonResult
public static final int CMD_TYPE_UPDATE_TIME = 4; // 校时请求。Body为mac(设备唯一标识)utf8 编码
// 云到端的请求命令
public static final int CMD_TYPE_SYSTEM_EXCEPTION = 0x8000; // 系统通用处理异常。Body的PB模型为TSLIOTCommonResult
public static final int CMD_TYPE_DEVICE_CONTROL = 0x8001; // 设备控制请求,Body的PB模型为TSLIOTDeviceControlRequest
public static final int CMD_TYPE_DATA_PASS_THROUGH = 0x8002; // 数据透传通道
public static final int CMD_TYPE_MODIFY_PWD = 0x8003; // 修改设备密码,Body的PB模型为TSLIOTModifyPwdRequest
public static final int CMD_TYPE_UPDATE_TIME_ACK = 0x8004; // 校时返回时间戳,Body的PB模型为TSLIOTTimeResult
/**
* 智慧通行业务:
*/
// 端到云的请求命令
public static final int CMD_TYPE_PULL_FILTER_LIST = 1; // 拉取黑白名单。Body的PB模型为TSLIOTPullFilterListRequest
public static final int CMD_TYPE_DISPATCH_FILTER_LIST_ACK = 2; // 下发黑白名单结果。Body的PB模型为TSLIOTCommonResult
public static final int CMD_TYPE_UPDATE_ONCE_PWD_ACK = 5; // 下发一次性密码结果。Body的PB模型为TSLIOTCommonResult
// 云到端的请求命令
public static final int CMD_TYPE_DISPATCH_FILTER_LIST = 0x8002; // 下发黑白名单。Body的PB模型为TSLIOTDispatchFilterListRequest
public static final int CMD_TYPE_DISPATCH_ONCE_PWD = 0x8003; // 下发一次性密码。Body的PB模型为TSLIOTIssueOncePWDRequest
/**
* 日志服务:
*/
// 端到云的请求命令
public static final int CMD_TYPE_UPDATE_LOG = 1; // 上报设备日志。Body的PB模型为TSLIOTUploadLogRequest
public static final int CMD_TYPE_SUB_DEVICE_ONLINE = 2; // 子设备在线状态更新。Body的PB模型为TSLIOTOnlineRequest
public static final int CMD_TYPE_UPDATE_DEVICE_INFO = 3; // 上报设备信息。Body的PB模型为TSLIOTUploadDeviceInfoRequest
// 云到端的请求命令
public static final int CMD_TYPE_UPDATE_LOG_ACK = 0x8000; // 上报设备日志结果。Body的PB模型为TSLIOTCommonResult