Hi There,
here is some Bluetooth Multiplayer blah
Add these lines into your Project.
IMPORT "C" void GLB_iBT_Init()
IMPORT "C" void GLB_iBT_Start(const char* sessID)
IMPORT "C" int GLB_iBT_Send(const char* strValue)
IMPORT "C" const char* GLB_iBT_Recv()
IMPORT "C" int GLB_iBT_Connected()
use this functions in your game. Init at start of your Program, Start opens the Bluetooth search dialog.
to compile add attached lib and GameKit.framework to your xcode project.
[attachment deleted by admin]
great ! :happy:
Another fine release, well done Truci! :good:
Can anyone recommend a good link on Bluetooth networking? Its completely new to me.
Hi there,
As usual another great work coming from trucidare!
Thanks for sharing!
King Regards, fjsantos.
Trucidare iz da man 8)
Thats brilliant. Nice one! Got a simple effort working no worries. A couple of questions though:-
1. How do you close a connection so you can start a new one with a different device? I tried using the init function again, which works but I end up with multiple versions of the same device on the menu list. Tried the start function and it picks up the old connection straight away. Can't see how to stop the connection to search for a new one (without using init again)
2. Is it possible to allow more than two players? I have heard elsewhere of certain games (eg. Guitar Hero) using 4 player for example. Does this current lib handle it, or is it only for 2 players?
Thanks for the library, brilliant stuff!
Cheers
i dont know if the new gamekit allows more than 2 players - i will have a look in the next days. i think closing and create a new connection should be no problem
First of all, brilliantly done trucidare! I know this is a bit late, but I only noticed this thread and library recently :whistle:
It's been a long time since this was released, but I have found two problems in my testing:
1) It seems that after a while and many sends and receives, the app will crash. The best I've been able to get out of the use of GDB is the error 'EXC_BAD_ACCESS', which seems to happen during either the receive or send function - I'm unsure of which ATM (in other words I forgot which one sry).
2) After the devices go out of range, or disconnect for some other reason, if the app is left open, the flag that remembers whether the device is 'busy' or not seems to be left set, and it cannot connect with any other devices due to this.
Apart from these problems, everything seems to work outstandingly well.
Thanks Trucidare, that would be great!
Cheers
Okay apparently, at some point in the receive function the call:
[CFString _fastCharacterContents]
is made to a deallocated instance.
More specifically, the function listed on the stack in the debugger is "-[iBluetooth _GLB_iBT_Recv]".
I can't offer anything more than this, and the assembly code that the program stops on (I doubt that would help much but ask if you want it), as I don't have the actual code...
ok i will have a look, sounds like the var to store informations to receive are broken after some readings.
okay thanks!
hmm i´m thinking about a xcode template for writing external libs.
Really? With also a bit of a tutorial on how to create our own XCode libs that link to GLB then it would surely expand much quicker. I mean you do amazing stuff, but there is only so much one man can do!
Cheers
Yeah, I can get one of the devices to crash out after a while too. Don't know why it happens just after a few minutes of knocking data back and fore one of the devices just dies off.
Any news on the closing a link down? Would totally clean mine up if I could close an existing link down and effectively start again without calling init.
Admittingly I don't know much about bluetooth communication, but I send an update message once a second, and try to retreive a message every single loop incase I miss anything. Do I need to worry about that, or will it stay on a queue and when I next receive it will pick up the last one? What I am getting at the minute is now and again a move is missed by the receiver. Before I start debugging more (for example I am 99% sure it should always send a move to the other device when a move is made, but perhaps it's not for some reason) then have you any better advice on how to use this library in the middle of a game loop? My game is fairly simple, and knowing of a move once a second or even longer is fine.
Cheers
Here the source of the Project. Added close function.
[attachment deleted by admin]
Nice one mate! I'll try it out tomorrow. Did you find why it dies off after a while?
Cheers
sorry no, didnt have enough time to check and debug, i think its a overflow in recv function.
Just trying to implement the new .a file. So I overwrote the original .a file with the one held in the latest release, and then added the extra close function in GLB like this:-
?IFDEF IPHONE
IMPORT "C" void GLB_iBT_Init()
IMPORT "C" void GLB_iBT_Start(const char* sessID)
IMPORT "C" int GLB_iBT_Send(const char* strValue)
IMPORT "C" const char* GLB_iBT_Recv()
IMPORT "C" int GLB_iBT_Connected()
IMPORT "C" void GLB_iBT_Close()
?ELSE
FUNCTION GLB_iBT_Init:
ENDFUNCTION
FUNCTION GLB_iBT_Start: iBTID$
ENDFUNCTION
FUNCTION GLB_iBT_Send: iBTMessage$
ENDFUNCTION
FUNCTION GLB_iBT_Recv:
ENDFUNCTION
FUNCTION GLB_iBT_Connected:
ENDFUNCTION
FUNCTION GLB_iBT_Close:
ENDFUNCTION
?ENDIF
And then I reference GLB_iBT_Close in my GLB code, but in Xcode I am getting an error saying Symbol(s) not found for _GLB_iBT_Close. Where am I going wrong?
Cheers
uhm oh check the extern "C" functions i think the alcoholic drinks made me making a typo.
// EDIT:// or you forgot to replace the iBluetooth.a try again to overwrite
Ok. Originally I copied the function name from a C header file I found. I will try again a little later. It should definitely be using the correct .a file although I will double check. Out of interest is it the .a file from the release directory or the debug directory? I assumed release.
Cheers
check the creation date.
It says today. I removed the .a file from the Mac, and made sure the .a file from the zip file was used instead. But I still get the same error messages about symbol(s) not found for _GLB_iBT_Close.
Cheers
uhm i think its because i compiled for armv6 only??? could anyone check?
Try this.
Beware, when 2 string arrive before you try to receive data, you only get the latest received string - no queue is established, yet.
[attachment deleted by admin]
Rats going out tonight. Will try tomorrow. Is it the .a file in the release directory or debug directory?
No worries, that should be fine with the way I've coded it already.
Cheers
don't use the .a library. Use the .mm source code file.
Ah, now you are losing me slightly. I have only got to the using .a files in XCode stage of things. So far I have incorporated Trucidare's .a file he originally posted at the start of this thread, and it is working pretty well (2 idevices talk to each other pretty nicely apart from the mentioned lack of closing ability and that it crashes after a while). As far as .mm files go then you have lost me. So I take it I remove the use of Trucidare's .a file from XCode? But then what do I do with the .mm file?
Cheers
choose the .a file or .mm file if you wont provide source code of bluetooth wrapper choose the .a both have the same result.
no - I did not compile the .mm into a .a file. If you try my fix, you must use hte .mm file.
Finally got round to testing! Ok I must be doing something wrong. I took the .mm and .h files out of your zip file and put them in the classes directory (assume this from iAds thread) on XCode. I then completely removed the .a file from XCode and any reference to it. GLB code stayed the same but when I hit compile I get these errors (see attached image).
Obviously I'm doing something wrong here, but with my extremely limited knowledge of XCode (getting the .a to work in the first place was about the limit of what I know at the minute) I don't know where to go from here.
Cheers
Ps. What is even weirder is that I removed the bluetooth code from GLB but it still errored in XCode with references to the Bluetooth functions. Turns out that the libs I normally scp over (/XCode/GLBasic/Lib) are not being updated (specifically libPROGRAM.a). Infact libPROGRAM.a is now being updated in /XCode/Lib. Copy that manually over and it works again. Has the path changed then or something? Is the XCode/GLBasic directory now not needed, and everything is just in XCode?
[attachment deleted by admin]
QuoteIs the XCode/GLBasic directory now not needed, and everything is just in XCode?
That seems to be exactly what has happened. I remember someone posting that the extra subfolder wasn't really necessary.
#import <GameKit/GameKit.h>
Ok I sorted out all my folders and the like. Hmm, that's weird. My XCode project doesn't allow me anymore to add the existing ibluetooth.h file into the classes folder (like I have done for iAds with the AppViewController.h file), only the .mm file.... hmm, that will be a problem right? Also with the #import line you posted where does that go exactly? Is it in the .h file or the .mm file?
Cheers
right under Foundation/Foundation.h
if xcode strikes to add the file - the file exists in project folder. delete it or add it and uncheck the copy button.
Works well! :good: :good:
nice demo
nice one! :good:
I couldn't compile the iBT code - I had to remove the "self"s from in front of iGotRecvData and connectState. It seems to be working now though - with the exception of the "EXC_BAD_ACCESS" problem - although it takes a bit of time of constant messaging between the devices to invoke this...
Now that we have the source code, the debugger highlights:
strcpy(gStrRev, [strTemp UTF8String]);
...in this block of code for the internal receive function:
// GF: use global string buffer
char gStrRev[2048];
const char* GLB_iBT_Recv() {
NSString* strTemp = [myBluetooth _GLB_iBT_Recv];
gStrRev[0]='\0';
strcpy(gStrRev, [strTemp UTF8String]);
prevPost = strTemp;
return gStrRev;
}
when there is the memory access problem.
Specifically, it says that 'strTemp' is an invalid CFStringRef when I hover over it...
The connection call pulses are controlled by the iOS and during debugging the connections are slow but usually, with the devices alone, connect quickly.
There were a couple of typos as mentioned although no big deal. The only time I got EXC_BAD_ACCESS is when trying to send data when not connected or something like that.
Although now it works fine and here is a non-tested GLB code sample of what I have so far:
TYPE _data
connected
connected_last
data_recv$
data_send$
session_id$
peer_id$
self_id$
master
toggle
time
ENDTYPE
GLOBAL tooth AS _data
bluetooth_main()
FUNCTION bluetooth_main:
LOCAL time$
tooth.session_id$ = "01"
GLB_iBT_Init()
GLB_iBT_Start(tooth.session_id$)
tooth.connected = GLB_iBT_Connected()
WHILE NOT tooth.connected
PRINT "Connecting", 1, 1
SHOWSCREEN
tooth.connected = GLB_iBT_Connected()
WEND
tooth.peer_id$ = GLB_iBT_PeerID()
tooth.data_send$ = "PEERID:" + tooth.peer_id$
GLB_iBT_Send(tooth.data_send$)
time$ = MID$(PLATFORMINFO$("TIME"),11,8)
WHILE tooth.connected
tooth.data_recv$ = GLB_iBT_Recv()
tooth.data_send$ = "TIME:" + time$
GLB_iBT_Send(tooth.data_send$)
recv_data()
PRINT "LOCAL TIME:" + time$, 1, 1
PRINT "REMOTE TIME:" + tooth.time$, 1, 20
SHOWSCREEN
WEND
GLB_iBT_Close()
ENDFUNCTION
FUNCTION recv_data:
LOCAL match$
tooth.connected = GLB_iBT_Connected()
IF tooth.connected
tooth.data_recv$ = GLB_iBT_Recv()
IF tooth.data_recv$ <> "NO_DATA"
match$ = left_match$(tooth.data_recv$, "PEERID:")
IF match$ <> ""
tooth.self_id$ = match$
IF tooth.self_id$ < tooth.peer_id$
tooth.master = MASTER_LOCAL
ELSE
tooth.master = MASTER_REMOTE
ENDIF
ENDIF
match$ = left_match$(tooth.data_recv$, "TIME:")
IF match$ <> ""
tooth.time$ = time$
ENDIF
ENDIF
tooth.data_recv$ = "NO_DATA"
ENDIF
ENDFUNCTION
FUNCTION left_match$: word_data$, match$
LOCAL length1 = LEN(word_data$)
LOCAL length2 = LEN(match$)
LOCAL result$
IF LEFT$(word_data$, length2) = match$
result$ = RIGHT$(word_data$, length1 - length2)
ELSE
result$ = ""
ENDIF
RETURN result$
ENDFUNCTION
Do you really have no problems at all? It's strange - even running your code I have the same problem with the same line...
We can't tell who's the odd-one-out unless others test as well... Anyway I've only updated the two devices I'm using to 4.0 and 4.1 - what are yours using? There must be some reason why we have different results...
I've updated my sig with spec for my devices.
Maybe it could be an issue with version but you should really post you code also.
I'll post the version of the iBluetooth code I'm using soon - I don't really have time ATM. I'll see if updating to a later OS version makes a difference as well - I've been meaning to update for a while...
i'm missing the declaration of the GLB_iBT_PeerID() in the .h or .mm file, can someone post the code with this declartion,
Thanks