基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版

本文详述如何使用CrossApp框架、mosquitto和easySQLite实现Android版MQTT协议的步进电机控制客户端。通过修改源代码解决编译错误,并配置路由器进行IP映射,实现外网连接到本地MQTT broker。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文在前一篇基础上,详细介绍以CrossApp跨平台框架为基础,利用mosquito库和easySQLite库设计实现了基于MQTT协议的android版步进电机控制客户端。

一、开发环境的准备

编译环境为CrossApp平台提供的一键部署windows下android开发环境的工具包:
下载地址:
http://pan.baidu.com/s/1qW6ql32#dir/path=%2FCrossApp-Ide

工具包的安装在此省略。参考文章:
https://www.oschina.net/question/1271569_160671

一步步按照向导设置好自己的软件环境。我安装的是x64版。

二、工程的构建和基本设置

安装好后,运行C:\CrossApp\eclipse下的eclipse.exe

参考:http://blog.youkuaiyun.com/j2066/article/details/47624109

菜单->file->new->other
这里写图片描述

然后next,选对相应的android工程:

这里写图片描述

这里写图片描述

导入成功后看到:

这里写图片描述

看到前面左下角有个红色的叉,这是因为框架代码没有导入进来。
接着,按照前面的方法导入CrossApp框架代码工程:

这里写图片描述

然后看到有错误提示:

[2017-10-02 20:09:21 - StepMotorController] Unable to resolve target 'android-20'
[2017-10-02 20:14:47 - libCrossApp] Unable to resolve target 'android-20'
[2017-10-02 20:14:49 - libCrossApp] Unable to resolve target 'android-20'

这里写图片描述

需要修改libCrossApp的属性。
对着libCrossApp点右键,选Properties(属性):
这里写图片描述

在Project Build Target中选Android 4.4.2:

这里写图片描述

对于StepMotorController项目也一样设置这个地方:
这里写图片描述

接着,我们需要修改一下StepMotorController项目下的make文件:
双击项目下的jni下的Android.mk文件:

这里写图片描述

需要修改这个地方:

这里写图片描述

为去掉注释符号:

$(call import-add-path, $(LOCAL_PATH)/../../../..)
$(call import-add-path, $(LOCAL_PATH)/../../../../CrossApp/the_third_party/)

先编译一下,右击项目,Run As->Android Application:
这里写图片描述

看到命令行有个错误:

这里写图片描述

这个错误是本项目的NDK构建环境android-ndk-r9路径设置有问题造成的:
右键点StepMotorController属性(Properties)->c/c++ Build->Environment->NDK ROOT:

这里写图片描述

双击这一行,把NDK ROOT设置为自己的路径,我们装包默认的是C:\CrossApp\android-ndk-r9d:

这里写图片描述

点OK:

这里写图片描述

还有一个地方需要修改:
这里写图片描述

修改为我们安装的目录:
C:\CrossApp\android-ndk-r9d\ndk-build.cmd

点OK,编译一下,看到一条错误:

jni/../../Classes/easySQLite/SqlCommon.h:136:22: error: format not a string literal and no format arguments [-Werror=format-security]

参考网上文章,原因是:

  android-ndk-r9与Eclipse的版本不兼容问题

解决方法:

  在对应项目的proj.android/jni/Application.mk添加一句话

  APP_CFLAGS += -Wno-error=format-security

  意思就是无视这个error
  
这里写图片描述

再次编译,又出来错误:

jni/../../Classes/MenuViewController.cpp:105:15: error: converting to execution character set: Illegal byte sequence

这个错误原因是MenuViewController.cpp这个文件的文本格式是ANSI,因为不是支持unicode的格式,所以,不支持中文编码。
解决这个问题的方法是,用记事本打开这个文件另存为UTF-8格式:
这里写图片描述

编译一下,又出现错误:

jni/../../Classes/easySQLite/SqlCommon.cpp: In member function 'sql::string sql::time::format(const char*)':
jni/../../Classes/easySQLite/SqlCommon.cpp:70:38: error: 'localtime_s' was not declared in this scope
   if (localtime_s(&localtime, &_value) == 0)
                                      ^
jni/../../Classes/easySQLite/SqlCommon.cpp: In function 'sql::string sql::intToStr(int)':
jni/../../Classes/easySQLite/SqlCommon.cpp:116:43: error: '_itoa_s' was not declared in this scope
  _itoa_s(value, buffer, sizeof(buffer), 10);
                                           ^
jni/../../Classes/easySQLite/SqlCommon.cpp: In function 'sql::string sql::intToStr(sql::integer)':
jni/../../Classes/easySQLite/SqlCommon.cpp:123:45: error: '_i64toa_s' was not declared in this scope
  _i64toa_s(value, buffer, sizeof(buffer), 10);
                                             ^
make.exe: *** [obj/local/armeabi/objs/CrossApp_cpp_shared/__/__/Classes/easySQLite/SqlCommon.o] Error 1

这些错误的原因是我们目前使用的easySQLite库版本太老了,g++编译器(ndk用的是4.8)对这些函数不支持,解决方法是下载一个更新一点的版本来替换原库。这个版本是cocos-2dx引擎提供的:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值