【原创】cocos2d-x3.9蓝牙开发之蓝牙开启
本人第一次搞android开发,很多东西都是只知道一点点,然而都没怎么实践过,所以这次就边学边做自己想要的功能,可能会花较长时间,不过肯定是值得的,有用词或哪里说得不对的请指正。
我自己有android和windows的东西,所以只能暂时只能搞android。
蓝牙开发有几个关键步骤,我一步步来
1,首先开启蓝牙
2,搜索可用设备
3,创建蓝牙socket,获取输入输出流
4,读取和写入数据
5,断开连接关闭蓝牙
我先从第一步开始实现,开启蓝牙,而开启蓝牙是需要一个过程的。
流程是这样的,点击开启按钮后lua ->c++ ->java,等待用户反馈,用户反馈后java ->c++ ->lua处理用户的反馈
首先要用java先实现android开启蓝牙的功能和用户反馈后的回调处理,在frameworks\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib目录下新建 Cocos2dxBluetooth.java:
Cocos2dxBluetooth.java:
package org.cocos2dx.lib;import android.bluetooth.BluetoothAdapter; import android.content.Intent; import android.preference.PreferenceManager.OnActivityResultListener; import android.util.Log;/*** Created by SmileYG on 2016/1/4. * Cocos2dxBluetooth实现OnActivityResultListener接口的原因是,startActivityForResult需要一个Activity对象才能调用,init的时候我把Cocos2dxActivity的实例对象传进来调用了, * Cocos2dxActivity内的onActivityResult函数里会对实现了OnActivityResultListener的对象进行了回调分发,要需要分发前需要加入一个集合里 * 即下面的Cocos2dxHelper.addOnActivityResultListener,具体看看代码就可知*/ public class Cocos2dxBluetooth implements OnActivityResultListener{static final int ENABLE_REQUEST_CODE = 1;private static Cocos2dxActivity sActivity = null;private static native void openRequestHandler(final boolean isOpened);public void init(Cocos2dxActivity activity){sActivity = activity;Cocos2dxHelper.addOnActivityResultListener(this);} //开启蓝牙,需要等待用户反馈public static void openBluetooth(){BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();if (!adapter.isEnabled()){Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);sActivity.startActivityForResult(intent, ENABLE_REQUEST_CODE);}} //用户反馈后的回调,openRequestHandler这个函数是调用c++的函数@Overridepublic boolean onActivityResult(int requestCode, int resultCode, Intent data){switch (requestCode){case ENABLE_REQUEST_CODE:if (resultCode == sActivity.RESULT_OK){openRequestHandler(true);}else if (resultCode == sActivity.RESULT_CANCELED){openRequestHandler(false);}}return true;} }
再在frameworks\cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxActivity.java加入一下代码,进行蓝牙的初始化,但没开启
protected void onCreate(final Bundle savedInstanceState) {.....this.mBluetooth = new Cocos2dxBluetooth();this.mBluetooth.init(this);.... }
然后在frameworks\cocos2d-x\cocos\platform\android\libcocos2dx目录里的AndroidManifest.xml文件里设置蓝牙权限,加入以下两句
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
之后需要lua脚本调用c++,c++再调用上面新加的java函数openBluetooth开启蓝牙功能,下面这个链接里是lua调用c++的方法,很详细:
http://segmentfault.com/a/1190000000631630#articleHeader4
而且c++调用java是利用cocos2d-x提供的JniHelper类完成的,下面链接也有详细方法:
http://blog.csdn.net/yuechuzhao/article/details/9283847
按照链接里的方法自己写好BluetoothMgr.h,BluetoothMgr.cpp,cocos2dx_bluetooth.ini后使用genbindings.py脚本生成桥接代码
BluetoothMgr.h和BluetoothMgr.cpp都放在frameworks\cocos2d-x\cocos\bluetooth目录下,新建的目录
BluetoothMgr.h代码:
#ifndef __BLUETOOTH_MGR_H_ #define __BLUETOOTH_MGR_H_#include "platform/CCPlatformMacros.h" #include "base/CCRef.h" //#include "base/CCConsole.h"#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #include "android/log.h" #include "platform/android/jni/JniHelper.h" #endifNS_CC_BEGIN #pragma once class BluetoothMgr:public Ref { public:BluetoothMgr(void);virtual ~BluetoothMgr(void);#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOSstatic void openBluetooth();static void openRequestHandler(bool isOpened);#endifprotected: };NS_CC_END#endif
BluetoothMgr.cpp
#include "BluetoothMgr.h"NS_CC_BEGIN BluetoothMgr::BluetoothMgr(void) { }BluetoothMgr::~BluetoothMgr(void) { }#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS) void BluetoothMgr::openBluetooth() {JniMethodInfo minfo;bool isHave = JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/lib/Cocos2dxBluetooth", "openBluetooth", "()V");if(isHave){minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);} }void BluetoothMgr::openRequestHandler(bool isOpened) {if(isOpened){__android_log_print(ANDROID_LOG_DEBUG, "openRequestHandler", "is %s", "true");}else{__android_log_print(ANDROID_LOG_DEBUG, "openRequestHandler", "is %s", "false");} } #endif
我是复制cocos2dx_audioengine.ini进行修改成cocos2dx_bluetooth.ini,改了以下地方,都是已经改好了的:
然后执行genbindings.py脚本,位置是frameworks\cocos2d-x\tools\tolua目录下,
一开始我是直接把genbindings.py脚本
拖进命令窗口执行的,报错:
Traceback (most recent call last):
File "/Users/test/frameworks/cocos2d-x/tools/bindings-generator/generator.py", line 1405, in <module>
main()
File "/Users/test/frameworks/cocos2d-x/tools/bindings-generator/generator.py", line 1380, in main
'headers': (config.get(s, 'headers' , 0, dict(userconfig.items('DEFAULT')))),
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ConfigParser.py", line 623, in get
return self._interpolate(section, option, value, d)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ConfigParser.py", line 691, in _interpolate
self._interpolate_some(option, L, rawval, section, vars, 1)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ConfigParser.py", line 723, in _interpolate_some
option, section, rest, var)
InterpolationMissingOptionError: Bad value substitution:
section: [cocos2dx_custom]
option : headers
key : cocosdir
然后google里找到了答案,就是cd到脚本根目录下运行脚本即可解决。
然后第二个错:
Traceback (most recent call last):
File "D:\soft\workSpace\MyLuaGame\frameworks\cocos2d-x\tools\bindings-generato
r/generator.py", line 1542, in <module>
main()
File "D:\soft\workSpace\MyLuaGame\frameworks\cocos2d-x\tools\bindings-generato
r/generator.py", line 1476, in main
raise Exception("Section not found in config file")
Exception: Section not found in config file
这个错是忘记把ini文件第一行修改了,原本是[cocos2dx_audioengine]改为[cocos2dx_bluetooth]即可。
之后把生成的桥接类代码嵌入lua环境中,在lua_module_register里加入lua_cocos2dx_bluetooth_auto.hpp的函数register_all_cocos2dx_bluetooth,记住include头文件。
蓝牙暂时只用在android和ios平台上
当用户点击反馈后需要java调用c++函数,即最上面写的 openRequestHandler函数,则可以直接在cocos2d-x提供的frameworks\cocos2d-x\cocos\platform\android\jni\Java_org_cocos2dx_lib_Cocos2dxHelper.cpp里加入以下代码:
extern "C" {JNIEXPORT void JNICALL Java_org_cocos2dx_lib_Cocos2dxBluetooth_openRequestHandler(JNIEnv * env, jobject obj, jboolean isOpened){BluetoothMgr::openRequestHandler(isOpened);}}
这样java即可调用c++函数了。
在frameworks\cocos2d-x\cocos下的Android.mk文件的LOCAL_SRC_FILES属性里加入bluetooth/BluetoothMgr.cpp。
在frameworks\cocos2d-x\cocos\scripting\lua-bindings\proj.android下的Android.mk文件的LOCAL_SRC_FILES属性里加入../auto/lua_cocos2dx_bluetooth_auto.cpp,因为lua_cocos2dx_bluetooth_auto.cpp里面include了 BluetoothMgr.h头文件,所以LOCAL_C_INCLUDES属性还要加上$(LOCAL_PATH)/../../../bluetooth,这是BluetoothMgr.h的文件路径,不加上报找不到BluetoothMgr.h文件的错误。
lua脚本里调用新加的方法 ccexp.BluetoothMgr:openBluetooth()
这样就可以编译了,切换到frameworks\runtime-src下运行命令cocos run -p android --android-studio生成apk包,装到手机里就可以测试了。
最近很忙。。。我慢慢做
转载于:https://www.cnblogs.com/SmileYG/p/5107998.html
【原创】cocos2d-x3.9蓝牙开发之蓝牙开启相关推荐
- 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框
目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...
- Android蓝牙开发 — 经典蓝牙BLE蓝牙
一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...
- Android蓝牙开发—经典蓝牙详细开发流程
文章目录 开发流程 权限 核心API BlueToothAdapter getDefaultAdapter():获取BluetoothAdapter对象 判断设备是否支持蓝牙 判断蓝牙是否开启 get ...
- 从零开始的nrf52832蓝牙开发(1)--蓝牙协议基础
想要进行蓝牙开发,第一步肯定要对蓝牙协议有所了解.除了要对蓝牙的一些专业术语有所熟悉,还应该对蓝牙协议每层功能有一定认知. 概略图: 物理层(PHY): 物理层规定了蓝牙频段:2400MHz~2483 ...
- android pin码 经典蓝牙_Android蓝牙开发—经典蓝牙详细开发流程
Android蓝牙开发-经典蓝牙详细开发流程 发布时间:2018-07-16 13:41, 浏览次数:637 , 标签: Android Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE( ...
- 蓝牙配对模式 java_【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码...
目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备 & 直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...
- 【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码
目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备 & 直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...
- android蓝牙聊天设备,Android蓝牙开发——实现蓝牙聊天
最近课上刚好需要做一个课程设计关于蓝牙的就挑选了个蓝牙聊天室,其实关键还是在于对蓝牙API的了解 一.蓝牙API 与蓝牙开发主要的相关类是以下四个 BluetoothAdapter 字面上则理解为蓝牙 ...
- iOS 蓝牙开发 BabyBluetooth蓝牙库介绍
BabyBluetooth 是一个最简单易用的蓝牙库,基于CoreBluetooth的封装,并兼容iOS和Mac OS X. 特色: 基于原生CoreBluetooth框架封装的轻量级的开源库,可以帮 ...
最新文章
- SignalR的另类实现技巧
- 基于STC8G1K17的信号转换方案
- FreeMarker简介及其语法
- 关于 sql server 基本使用的建议
- [NOTE] DSVW靶场练习笔记
- 开发时对业务技术框架的理解
- Windows server 2012 之路由功能
- mysql limit 后子查询_mysql 关于limit 子查询和获取某当天所有记录
- Python_爬虫_案例汇总:
- 【实践】面向广告主的猜你喜欢推荐与B端用户增长实践.pdf(附下载链接)
- 门当户对的感情真的很重要吗?
- matlab皮尔逊和斯皮尔曼,利用matlab计算Pearson和Spearman相关系数
- 宝塔面板搭建ftp服务器
- 风云2号卫星云图_今天从零教你开始利用Python打造词云图!
- 如何在Internet Explorer中使用VARCHART XGantt控件?
- usb大容量储存设备感叹号?USB大容量存储设备无法启动
- Si24R1超低功耗高性能2.4G无线收发器芯片
- python求最大素数_python-最大素数
- 用python画星空-用python画星空源代码是什么?
- 学习记录,linux使用wget命令实现整站下载
热门文章
- “暂时没有对您所在的地区提供下载和试听服务”的解决办法
- 大数据?这些你了解吗?------之基础知识篇
- SpringMVC的返回值和参数类型
- Spring @RequestMapping注解示例
- Selenium 屏幕截图
- mysql 数据备份方案_MySQL常见备份方案
- flink sink jdbc没有数据_No.2 为什么Flink无法实时写入MySQL?
- 计算机应用word作业,《计算机应用基础》作业
- python 学堂在线_最新网课答案2020学堂在线Python 交互式程序设计导论
- c++用一级运算比较大小_Python运算符