【原创】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包,装到手机里就可以测试了。

最近很忙。。。我慢慢做

时间: 2024-08-02 19:02:39

【原创】cocos2d-x3.9蓝牙开发之蓝牙开启的相关文章

【转】android蓝牙开发---与蓝牙模块进行通信--不错

原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同不同系统的官方包,正式宣布手机的蓝牙报销了,于是和朋友换手机.在测试的过程中也是非常痛苦,放假了,同学都几乎回家了,剩下的同学中竟然80%都是用非android手机!我和我的小伙伴都吓呆了!!就算

andriod 蓝牙开发之蓝牙搜索

蓝牙的搜索是通过广播来实现的.关键代码如下: 1.用于发现蓝牙的广播接受者 /** * 接收器 * 当搜索蓝牙设备完成时调用 */ private BroadcastReceiver _foundReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { BluetoothDevice device = intent .getParcelableExtra(Bluetoo

Android蓝牙开发入门

目录: 1. 蓝牙简史,现状 2. 蓝牙的应用场景 3. 蓝牙相关概念 4. Android蓝牙开发 1. 蓝牙简史: 蓝牙( Bluetooth)是一种无线技术标准,可以实现短距离(通常是几米范围之内)的无线通信.蓝牙技术始于1994年,迄今已经发展了超过20年.本质上它和其它几种射频通信技术类似,比如手机移动通信,近场通信技术(NFC),都是通过电磁波来实现不同设备的信息交换.区别在于无线电波的频率和发射功率不一样,从而传输距离也不一样. 2. 蓝牙的应用场景: l 移动电话和免提设备之间的

微信蓝牙开发板体验和开发指引

一.     嵌入式企鹅圈微信蓝牙开发板竞猜活动和开发板资源 1. 之前參与微信公众号(嵌入式企鹅圈)有奖竞猜活动已经结束.嵌入式企鹅圈微信蓝牙开发板已经发出给前15名猜中嵌入式企鹅圈主人的童鞋们. 2.开发板百度资源路径 请增加微信公众号(嵌入式企鹅圈).发送515获取百度网盘资源. 下面指引引用的路径的根文件夹即是网盘资源根文件夹. 嵌入式企鹅圈微信蓝牙开发板基于TI CC2541蓝牙单芯片.没有开发板的伙伴们也能够获取开发资源,源代码project全然适用于以TI CC2541 蓝牙单芯片

iOS开发 -GameKit蓝牙开发

蓝牙4.0 蓝牙4.0是2012年最新蓝牙版本,是3.0的升级版本:较3.0版本更省电.成本低.3毫秒低延迟.超长有效连接距离.AES-128加密等:通常用在蓝牙耳机.蓝牙音箱等设备上. 蓝牙技术联盟(Bluetooth SIG)2010年7月7日宣布,正式采纳蓝牙4.0核心规范(Bluetooth Core Specification Version 4.0 ),并启动对应的认证计划.会员厂商可以提交其产品进行测试,通过后将获得蓝牙4.0标准认证. 该技术拥有极低的运行和待机功耗,使用一粒纽扣

Android蓝牙开发,报BluetoothAdapter﹕ Can&#39;t create handler inside thread that has not called Looper.prepare

这个错误翻译的意思是:不能在没有Looper.prepare的线程里面创建handler. 起初我很疑惑,我根本没有用到工作线程,也没有创建handler.报错的代码如下: // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final Blu

以蓝牙开发的视觉解读微信Airsync协议

微信硬件平台使用蓝牙作为近场控制的连接件,并拟定了<微信蓝牙外设协议>.这份协议更像一个标准,用于规范微信和蓝牙外设之间的数据交互场景和接口.但从开发者来看,要完全读懂这份协议,恐怕需要熟读很多遍,并且要结合调试才能真正实现微信Airsync通信.笔者对IOT和微信硬件平台的整个框架和技术都比较熟悉了,并且已经在TI的CC254X和Dialog的DA14580上实现了微信Airsync协议通信.现在回过头来,从开发的角度,对微信Airsync协议进行重新解读,以帮助新进入物联网领域的开发者更快

android开发之蓝牙配对连接的方法

最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结. 在做android蓝牙串口连接的时候一般会使用 ? 1 2 3 4 5 6 7 8 BluetoothSocket tmp = null; // Get a BluetoothSocket for a connection with the // given BluetoothDevice try {          tmp = device.createRfcom

如何实现android蓝牙开发 自动配对连接,并不弹出提示框

如何实现android蓝牙开发 自动配对连接,并不弹出提示框 之前做一个android版的蓝牙,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就开始查找怎么关闭这个蓝牙配对提示框,后面还是伟大的android源码帮助了我. 在源码 BluetoothDevice 类中还有两个隐藏方法 cancelBondProcess()和cancelPairingUserInput() 这两个方法一个是取消配对进