中移M5311-NBIOT-低功耗OPENCPU开发-MQTT
M5311 全部技术资料文档和SIM卡封装库 链接:https://pan.baidu.com/s/1VHIwO4L85O6BtLLxbIoPRQ 提取码:7wxh
1.使用的模块M5311和开发板
2.测试环境搭建
1.安装GNU Tools ARM Embedded
链接:https://pan.baidu.com/s/1KtBCoAraLGcQD3K5keVFww 提取码:kzxy
下载下来之后解压,进入 GNU Tools ARM Embedded\GNU Tools ARM Embedded\4.9 2015q3\bin 文件夹
需要把bin路径加入环境变量
2.编译包
链接:https://pan.baidu.com/s/1_P_63FRWqI844MBFiYHbJQ 提取码:murc
把包下载下来之后使用VSCode打开目录
然后执行下面这条命令进行编译
编译完成后烧录包在M5311-OpenCPU_v4.0.0_release\firmware\LV 下面
.\build.bat LV
3.烧录
链接:https://pan.baidu.com/s/1GaH02xHhjJcg0o-8eOYSlw 提取码:1uka
下载烧录工具
选择COM口,点击OPEN,打开LV目录下的cfg文件,自动加载烧录配置信息
之后点击start,然后让板子重启或者开机(按住PWRKEY或者RESET按键)
3.程序
m5311_opencpu.c
/*
M5311_opencpu.c
created by xgl,2018/4/2
*/
#include "m5311_opencpu.h"
extern unsigned int OC_DEBUG_CHANNEL;
TaskHandle_t xHandle;
/*
综合测试函数
*/
void test_all_in_one()
{
int i;
unsigned char temp;
unsigned char iccid[40]={0};
int iccid_len;
unsigned char *p = 0;
int rssi,rxlevel;
unsigned char temp1,temp2;
unsigned char spi_rx_buf[2]= {0};
unsigned char spi_tx_buf[2]= {0};
unsigned char base_version[30] = {0};
hal_spi_master_config_t l_config;
hal_spi_master_send_and_receive_config_t spi_send_and_receive_config;
custom_uart_init();
opencpu_get_base_version(base_version);
opencpu_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
opencpu_printf("OpenCpu Code Vserion 1.2 \n");
opencpu_printf(opencpu_fota_version_cb());
opencpu_printf("\nBASE_VERSION:%s\n",base_version);
opencpu_printf("update status:%d\n",update_status);
if(opencpu_is_boot_from_sleep()==1){
opencpu_printf("BOOT CAUSE:WAKE FROM SLEEP\n");
}else{
opencpu_printf("BOOT CAUSE:POWER_ON OR RESET\n");
}
opencpu_printf("M5311 opencpu ready!!\n");
opencpu_printf("waiting for network...\n");
opencpu_lock_light_sleep(); // 关闭PSSM
//阻塞方式获取ICCID,必须要有SIM卡才能读到
test_get_iccid();
//获取网络注册状态,并阻塞等待网络注册成功
opencpu_printf("network registering...\n");
while(opencpu_cgact()!=1){
vTaskDelay(1);
}
opencpu_printf("network register success\n");
opencpu_printf("network ready!!\n");
uart_cmd = 0;
mqtt_test2();
opencpu_printf("opencpu_unlock_light_sleep!!\n");
ril_power_saving_mode_setting_req_t psm_req1;
psm_req1.mode=1;
psm_req1.req_prdc_rau=NULL;
psm_req1.req_gprs_rdy_tmr=NULL;
psm_req1.req_prdc_tau="01000001";
psm_req1.req_act_time="00000101";
opencpu_set_psmparam(&psm_req1);
ril_power_saving_mode_setting_rsp_t psm_rsp1;
opencpu_get_psmparam(&psm_rsp1);
opencpu_printf("PSM: %d,%s,%s,%s,%s \n",psm_rsp1.mode,psm_rsp1.req_prdc_rau,
psm_rsp1.req_gprs_rdy_tmr,psm_rsp1.req_prdc_tau,psm_rsp1.req_act_time);
opencpu_unlock_light_sleep(); // 打开PSM
opencpu_unlock_light_sleep(); // 打开PSM
opencpu_unlock_light_sleep(); // 打开PSM
vTaskDelete(xHandle); // 关闭线程
opencpu_printf("vTaskDelete over !!\n");
}
//opencpu主任务函数
void opencpu_task_main()
{
test_all_in_one();
}
/*
新建opencpu任务,这个函数用户不可更改
*/
void test_opencpu_start()
{
xTaskCreate(opencpu_task_main,"opencpu",1024,NULL,TASK_PRIORITY_NORMAL,&xHandle);
}
opencpu_mqtt.c
#include "m5311_opencpu.h"
/***************************************
以下定义适用于onenet mqtt套件
CLIENTID:对应设备名称
USER:对应产品ID
PWD:用onenet官网的token.exe工具生成。
CMDREQUEST:
***************************************/
#define HOST "183.230.40.16"
#define PORT 8883
#define CLIENTID "test"
#define KEEPALIVE 120
#define USER "247845"
#define PWD "version=2018-10-31&res=products%2F247845%2Fdevices%2Ftest&et=1694376057&method=md5&sign=32%2B6jCEhKLdgXwdvpAQM8g%3D%3D"
#define CMDREQUEST "$sys/247845/test/cmd/request/"
#define CMDRESPON "$sys/247845/test/cmd/response/"
uint8 onenetFlag = 0;
/*****************************************************
ack 回调函数,publish msg 收到ack后会触发该类型函数,用户自行编写;
传入:qos>0 时在opencpu_mqttpub 中传入该函数,不关心ack 可传入null
/*****************************************************/
void opencpu_recvpuback_cb()
{
opencpu_printf("OC get ack\n");
vTaskDelay(2000/portTICK_RATE_MS);
}
void opencpu_recvpuback_cb1()
{
opencpu_printf("last publish success,off\n");
vTaskDelay(1000/portTICK_RATE_MS);
opencpu_mqttdisc();
}
/*****************************************************
接收到某主题的回调函数:接收到平台下对topic的推送消息是会触发该类型函数。
传入:在opencpu_mqttsub 订阅某topic时传入该类型函数。
/*****************************************************/
void opencpu_defaultpublish_cb(uint32_t dup, uint32_t qos, uint32_t retained, uint32_t msgid, char *topicname, uint32_t msglen, char *msg)
{
}
void opencpu_userpublish_cb(uint32_t dup, uint32_t qos, uint32_t retained, uint32_t msgid, char *topicname, uint32_t msglen, char *msg)
{
opencpu_printf("+MYCB:%d,%d,%d,%d,%s,%d,%s\n",dup, qos, retained, msgid, topicname,msglen, msg);
vTaskDelay(2000/portTICK_RATE_MS);
//opencpu_mqttpub("temp1",1,0,0,0,"from_pub_usercb", NULL);
}
/*****************************
连接服务器成功的回调函数
*****************************/
void opencpu_open_cb(uint8_t result){
if(result == 0 ){
opencpu_printf("%s\n","MQTTCLIENT CONNECT OK");
}
}
/***********************************
和服务器断开的回调函数
***********************************/
void opencpu_disc_cb(){
opencpu_printf("%s\n","MQTTCLIENT DISCONNECTED ");
}
mqtt_test2()
{
opencpu_printf("mqtt test2 start\n");
opencpu_mqttdel();
opencpu_mqttcfg(HOST,1883,CLIENTID,60,USER,PWD,1);
int mqttopenstate = opencpu_mqttopen(1,1,0,0,0,0,0);
opencpu_printf("mqtt mqtt open state %d \n",mqttopenstate);
while(opencpu_mqttstat() != 5)
{
vTaskDelay(1000/portTICK_RATE_MS);
}
onenetFlag = 1;
vTaskDelay(1000/portTICK_RATE_MS);
opencpu_mqttsub("$oc/devices/{id}/user/test",1,opencpu_userpublish_cb);
opencpu_mqttpub("$oc/devices/{id}/user/test",0,0,0,0,"{\"id\":123458,\"dp\":{\"temperatrue\":[{\"v\":31,}],\"power\":[{\"v\":58,}]}}",NULL);
vTaskDelay(1000/portTICK_RATE_MS);
opencpu_mqttdisc(); // 关闭mqtt连接,避免无法进入PSM模式
opencpu_mqttdel();
vTaskDelay(1000/portTICK_RATE_MS);
opencpu_printf("mqtt test2 over\n");
}
在编写过程中,如果mqtt没有断开是无法进入PSM模式的,使用完后请调用opencpu_mqttdisc();