【原创】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++的函数
@Override
public 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"
#endif NS_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_IOS
static void openBluetooth(); static void openRequestHandler(bool isOpened);
#endif protected:
}; 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包,装到手机里就可以测试了。
最近很忙。。。我慢慢做
【原创】cocos2d-x3.9蓝牙开发之蓝牙开启的更多相关文章
- 【转】android蓝牙开发---与蓝牙模块进行通信--不错
原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利, ...
- android蓝牙开发---与蓝牙模块进行通信
近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同 ...
- android 蓝牙开发---与蓝牙模块进行通讯 基于eclipse项目
2017.10.20 之前参加一个大三学长的创业项目,做一个智能的车锁App,用到嵌入式等技术,App需要蓝牙.实时位置等技术,故查了几篇相关技术文章,以此参考! //先说 ...
- iOS 蓝牙开发资料记录
一.蓝牙基础认识: 1.iOS蓝牙开发: iOS蓝牙开发:蓝牙连接和数据读写 iOS蓝牙后台运行 iOS关于app连接已配对设备的问题(ancs协议的锅) iOS蓝牙空中 ...
- 以蓝牙开发的视觉解读微信Airsync协议
微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟 ...
- 浅谈Bluetooth蓝牙开发
前言:项目用到蓝牙开发,具体蓝牙获取硬件传感器中的数据. 因为没有蓝牙开发的相关经验,决定先了解一些蓝牙开发的知识,再去看之前同事写的蓝牙相关代码. ------------------------- ...
- Windows Phone 8.1低功耗蓝牙开发-Nokia Treasure Tag
1. 引言 上一篇文章<Windows 8.1 低功耗蓝牙开发>讲述了如何在Windows 8.1平台上创建低功耗蓝牙应用,并且以TI的Sensor Tag为例,给出了代码步骤和演示.其实 ...
- Qt on Android 蓝牙开发
版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载. 最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本 ...
- iOS蓝牙开发(二)蓝牙相关基础知识
原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...
随机推荐
- 详细的obs操作教程(windows/mac)图解
直播推流软件obs操作配置教程包含支持mac和windows配置 1 2 3 4 5 6 7 8 9
- TensorFlow CNN 測试CIFAR-10数据集
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50738311 1 CIFAR-10 数 ...
- UISegmentedControl 功能简单 分析
UISegmentedControl类似于UIButton,它可以提供多个选择操作,响应事件,但具有很大的局限性,我们更多的是使用自定义的,不过在这里还是介绍下它的基本用法. NSArray *seg ...
- Ant自己主动编译打包&公布 android项目
Eclipse用起来尽管方便,可是编译打包android项目还是比較慢,尤其将应用打包公布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自己主动编译打包了 ...
- 嵌套SQL语句訪问DB2中SQLCA的调用技巧
在IBM的关系型数据库产品DB2中,使用SQL Communication Area(SQLCA)将程序中嵌套的SQL语句执行情况返回给程序. 在程序中有针对性地对SQLCA实施调用,可对程序中各类S ...
- [学英语]vocabulary.com你都可以怎么用
vocabulary.com你都可以怎么用? 核心就是背单词. 1.利用纯英文环境熟悉单词,看看他们是如何解释单词的. 2.对于大段的文章,可以提炼出你需要背的单词. 3.以游戏的方式来背单词,app ...
- c语言的编译和运行流程
C语言源程序经过编译器进行词法分析 语法分析 等过程生成中间语言(object后缀的文件)编译期间会生成一个字符表和静态分配空间(如new static 全局变量)它们所需的内存空间可以计算出来放在链 ...
- dubbo开发中使用到的一些服务配置方式
通过之前的学习了解了dubbo的常规的使用,下面我们看看特殊情况或者说真实环境下使用dubbo的一些配置实例. 一.一个接口有多个实现时可以使用group来区分 1.服务提供者配置 <?xml ...
- Springboot整合日志时候出现的问题
上图是问题,按照路径去找下,发现其实是jar包重复导致的! 在对应的项目上,右键--->属性(Properties)--->JavaBuild Path 然后选择Libraries 页签 ...
- Cloneable 和clone的区别和联系
设计模式----原型模式时候,涉及到的复制克隆, Cloneable 接口,内部是没有任何方法的, 这个接口其实是一个标记性的接口,和Serializable是一样的,都是标记使用, 在类实现了这个C ...